브로드캐스트 리시버
1. 개요
1. 개요
브로드캐스트 리시버는 안드로이드 시스템에서 시스템이나 다른 애플리케이션이 발송한 방송을 수신하고 응답하는 앱 구성 요소이다. 이는 안드로이드 앱의 네 가지 기본 구성 요소 중 하나로, 액티비티, 서비스, 콘텐츠 프로바이더와 함께 동작한다.
브로드캐스트 리시버는 크게 정적 리시버와 동적 리시버 두 가지 유형으로 나뉜다. 정적 리시버는 안드로이드 매니페스트 파일에 선언되어, 앱이 실행 중이지 않을 때도 특정 방송을 수신할 수 있다. 반면 동적 리시버는 자바 또는 코틀린 코드 내에서 Context 객체를 사용해 등록하며, 주로 앱이 포그라운드에 있을 때 일시적인 이벤트를 수신하는 데 사용된다.
주요 용도는 시스템 이벤트 감지, 앱 간 통신, 그리고 주기적 작업 실행이다. 예를 들어, 기기 부팅이 완료되었거나 배터리가 부족해지는 시스템 방송을 감지하여 특정 작업을 시작하거나, 한 앱에서 특정 작업 완료를 알리는 방송을 발송하면 다른 앱의 리시버가 이를 수신하여 연계 작업을 수행할 수 있다.
브로드캐스트 리시버는 구글에 의해 안드로이드 1.0 API 레벨 1에서 최초로 도입되었다. 이를 통해 애플리케이션은 시스템의 전역적인 상태 변화나 다른 애플리케이션의 이벤트에 반응하는 유연한 구조를 가질 수 있게 되었다.
2. 역사
2. 역사
브로드캐스트 리시버는 안드로이드 운영 체제의 근본적인 구성 요소 중 하나로, 안드로이드 1.0 API 레벨 1부터 그 기본 틀이 마련되었다. 이는 초기 안드로이드 설계 철학인 느슨한 결합과 효율적인 앱 간 통신을 실현하기 위한 핵심 메커니즘으로 도입되었다. 시스템 전반의 중요한 상태 변화나 이벤트를 다양한 애플리케이션이 인지하고 대응할 수 있도록 하는 표준화된 채널을 제공하는 것이 목적이었다.
초기에는 주로 정적 리시버 형태로 매니페스트 파일에 선언되어, 시스템 이벤트를 감지하는 데 활용되었다. 대표적인 예로 부팅 완료, 화면 꺼짐, 배터리 상태 변경, 문자 메시지 수신 등의 이벤트를 수신하여 앱이 필요한 초기화 작업이나 백그라운드 처리를 수행할 수 있게 했다. 이는 앱이 항상 실행 중이지 않아도 특정 조건에서 시스템에 의해 자동으로 활성화될 수 있는 강력한 기능이었다.
시간이 지나며 안드로이드의 생태계가 복잡해지고 보안 및 배터리 수명에 대한 요구가 강화되면서, 브로드캐스트 리시버의 사용과 제한 사항도 진화했다. 특히 동적 리시버의 등장은 런타임 중에 브로드캐스트를 등록하고 해제할 수 있는 유연성을 제공했지만, 남용 시 시스템 성능에 부정적 영향을 줄 수 있어 이후 안드로이드 버전에서 점차 그 사용이 제한되는 방향으로 정책이 변화해 왔다. 이러한 역사적 흐름은 구글이 플랫폼의 효율성과 사용자 경험을 지속적으로 개선하려는 노력의 일환으로 볼 수 있다.
3. 기능
3. 기능
브로드캐스트 리시버의 주요 기능은 시스템 또는 다른 애플리케이션이 발신한 방송 메시지를 수신하고, 그에 따른 적절한 작업을 실행하는 것이다. 이는 안드로이드 앱이 시스템의 중요한 상태 변화를 인지하거나, 앱 간에 간접적으로 정보를 교환할 수 있게 해주는 핵심 메커니즘이다.
가장 대표적인 기능은 시스템 이벤트를 감지하는 것이다. 예를 들어, 부팅 완료, 배터리 잔량 부족, 화면 꺼짐, 네트워크 연결 상태 변경, 문자 메시지 수신 등의 이벤트가 발생하면 시스템이 해당 내용을 담은 방송을 발송한다. 이를 수신한 브로드캐스트 리시버는 즉시 특정 작업을 수행할 수 있다. 또한, 한 애플리케이션이 특정 작업을 완료했음을 다른 앱에 알리거나, 사용자 정의 이벤트를 통해 앱 간의 느슨한 결합 통신을 가능하게 하는 용도로도 널리 사용된다.
과거에는 백그라운드에서 주기적인 작업을 실행하기 위한 수단으로도 활용되었으나, 배터리 수명과 시스템 성능 최적화를 위해 이러한 사용은 제한되었다. 대신 안드로이드 잡스케줄러나 워크매니저와 같은 더 효율적인 API를 사용하는 것이 권장된다.
4. 구성 요소
4. 구성 요소
브로드캐스트 리시버는 크게 두 가지 유형, 즉 정적 리시버와 동적 리시버로 구분된다. 이 두 유형은 등록 방식과 생명주기에서 근본적인 차이를 보인다.
정적 리시버는 안드로이드 매니페스트 파일에 선언하여 등록한다. 앱이 설치되는 시점에 시스템에 의해 등록되며, 앱이 실행 중이지 않아도 지정된 방송을 수신할 수 있다는 특징이 있다. 이는 부팅 완료나 화면 꺼짐과 같은 중요한 시스템 이벤트를 항상 감지해야 할 때 주로 사용된다.
반면 동적 리시버는 자바 또는 코틀린 코드 내에서 registerReceiver() 메서드를 사용해 런타임에 등록한다. 이 리시버는 등록한 액티비티나 서비스의 생명주기에 묶여 동작한다. 따라서 해당 컴포넌트가 소멸되기 전에 unregisterReceiver()를 호출하여 수동으로 등록을 해제해야 하며, 그렇지 않으면 메모리 누수가 발생할 수 있다.
이러한 구성 요소들은 인텐트 필터를 통해 자신이 수신하고자 하는 방송의 종류를 구체적으로 지정한다. 시스템은 방송이 발송되면 해당 인텐트 필터와 일치하는 모든 리시버를 찾아 그 onReceive() 메서드를 호출하여 작업을 수행하게 한다.
5. 동작 원리
5. 동작 원리
브로드캐스트 리시버는 안드로이드 시스템 내에서 발생하는 특정 이벤트, 즉 브로드캐스트를 감지하고 이에 반응하는 앱의 핵심 구성 요소이다. 그 동작 원리는 크게 방송의 발송, 등록 및 필터링, 그리고 수신과 실행의 세 단계로 나누어 볼 수 있다.
먼저, 시스템이나 다른 앱이 인텐트 객체를 생성하여 sendBroadcast()와 같은 메서드를 호출하면 방송이 발송된다. 이 인텐트에는 방송의 종류를 식별하는 액션 문자열이 포함되며, 필요에 따라 추가 데이터를 담을 수 있다. 예를 들어, 배터리 잔량이 낮아지면 시스템은 "ACTION_BATTERY_LOW"라는 액션을 가진 방송을 발송한다.
발송된 방송은 시스템의 브로드캐스트 매니저가 관리한다. 리시버는 이 방송을 수신하기 위해 반드시 사전에 등록되어야 하며, 등록 방식에 따라 정적 리시버와 동적 리시버로 구분된다. 정적 리시버는 매니페스트 파일에 선언되어 앱이 설치될 때 시스템에 등록되며, 주로 부팅 완료와 같은 중요한 시스템 이벤트를 감지하는 데 사용된다. 반면 동적 리시버는 액티비티나 서비스 내에서 코드를 통해 실행 중에 등록(registerReceiver()) 및 해제(unregisterReceiver())되며, 특정 화면이 활성화된 동안에만 이벤트를 처리할 때 유용하다. 등록 시 리시버는 인텐트 필터를 설정하여 자신이 수신하고자 하는 방송의 액션을 지정함으로써 원하는 방송만을 선별적으로 받아낸다.
마지막으로, 발송된 방송의 인텐트 액션이 어떤 리시버의 인텐트 필터와 일치하면, 시스템은 해당 리시버를 찾아 그 onReceive() 메서드를 호출한다. 이 메서드 내에서 개발자는 방송 수신 시 수행할 작업(예: 알림 표시, 서비스 시작, 데이터 갱신)을 정의한다. 주의할 점은 onReceive() 메서드는 메인 스레드에서 실행되며, 실행 시간이 짧아야 한다는 것이다. 시간이 오래 걸리는 작업은 서비스를 시작하거나 작업 스케줄러를 이용해 백그라운드에서 처리하도록 설계해야 시스템의 반응성을 해치지 않는다.
6. 사용 예시
6. 사용 예시
브로드캐스트 리시버는 안드로이드 앱이 시스템의 다양한 상태 변화나 다른 앱의 알림을 감지하고 이에 반응할 수 있게 해주는 핵심 메커니즘이다. 가장 대표적인 사용 예는 시스템 이벤트를 감지하는 것이다. 예를 들어, 앱이 부팅 완료 방송을 수신하도록 설정하면, 사용자가 스마트폰을 켤 때마다 자동으로 필요한 서비스를 시작할 수 있다. 마찬가지로 배터리 잔량이 낮아지거나 충전이 시작되는 시점, 화면이 꺼지거나 켜지는 시점, 네트워크 연결 상태가 변경되는 시점 등을 감지하여 앱이 상황에 맞는 적절한 동작을 수행하도록 유도한다.
앱 간의 간접적인 통신을 위한 채널로도 널리 활용된다. 한 앱이 특정 의도를 담은 방송을 발송하면, 이에 관심 있는 다른 앱들이 브로드캐스트 리시버를 통해 해당 방송을 수신하고 데이터를 처리할 수 있다. 이는 앱들이 서로를 직접 알지 못해도 느슨하게 결합된 방식으로 협력할 수 있는 기반을 제공한다. 예를 들어, 사진 촬영 앱이 새 이미지 저장을 알리는 방송을 보내면, 클라우드 백업 앱이나 갤러리 앱이 이를 수신하여 자동으로 새 사진을 동기화하거나 목록을 갱신할 수 있다.
또한, 알람 매니저와 결합하여 특정 시간에 또는 주기적으로 작업을 실행하는 용도로 사용된다. 개발자는 원하는 시간에 발생하도록 설정한 알람이 울릴 때 시스템이 발송하는 방송을 리시버로 수신한다. 리시버는 이 방송을 수신하면 백그라운드에서 서비스를 시작하거나 노티피케이션을 표시하는 등의 사전 정의된 작업을 실행한다. 이를 통해 사용자가 앱을 직접 실행하지 않은 상태에서도 정해진 시간에 데이터를 갱신하거나 사용자에게 알림을 제공하는 기능을 구현할 수 있다.
7. 안드로이드 버전별 차이
7. 안드로이드 버전별 차이
안드로이드 운영체제의 버전이 업데이트되면서 브로드캐스트 리시버의 등록 및 동작 방식에 여러 차이점이 생겼다. 이는 주로 시스템 성능과 배터리 수명 최적화, 보안 강화를 위한 목적에서 비롯된 변화이다.
안드로이드 3.1(API 레벨 12)부터는 앱이 설치된 후 사용자가 최소 한 번 이상 실행하기 전까지는 모든 암시적 방송을 수신할 수 없도록 제한되었다. 이는 사용자가 인지하지 못하는 앱이 백그라운드에서 불필요하게 동작하는 것을 방지하기 위한 조치이다. 또한 안드로이드 7.0(API 레벨 24)에서는 대부분의 암시적 방송에 대해 정적 리시버를 사용할 수 없게 되었다. 대표적으로 CONNECTIVITY_ACTION 방송은 동적 리시버를 통해서만 수신 가능해졌다.
안드로이드 8.0(API 레벨 26)에서는 더욱 엄격한 제한이 도입되어, 대부분의 암시적 방송은 앱이 포그라운드에 있을 때 등록한 동적 리시버로만 수신할 수 있게 변경되었다. 단, 몇 가지 예외적인 방송, 예를 들어 BOOT_COMPLETED는 매니페스트에 선언된 정적 리시버로도 계속 수신이 가능하다. 안드로이드 9(API 레벨 28)에서는 네트워크 관련 방송 수신에 추가적인 권한(ACCESS_NETWORK_STATE, ACCESS_WIFI_STATE)이 필요해지는 등 보안이 더욱 강화되었다.
이러한 변화의 흐름은 개발자로 하여금 정적 리시버의 사용을 최소화하고, 필요 시점에만 동적 리시버를 등록하며, 작업 실행에는 브로드캐스트 리시버 대신 JobScheduler나 WorkManager 같은 대체 수단을 적극 고려하도록 유도하고 있다. 이는 시스템 전체의 효율성과 사용자 경험을 개선하기 위한 안드로이드 플랫폼의 지속적인 노력을 반영한다.
8. 주의사항
8. 주의사항
브로드캐스트 리시버를 사용할 때는 몇 가지 주의점이 있다. 안드로이드 8.0 (API 레벨 26)부터는 대부분의 암시적 방송에 대한 정적 리시버의 등록이 제한된다. 이는 배터리 수명과 시스템 성능을 보호하기 위한 조치로, 부팅 완료나 네트워크 상태 변경과 같은 시스템 이벤트를 수신하려면 대부분 동적 리시버를 런타임에 등록해야 한다.
동적 리시버는 액티비티나 서비스의 생명주기에 맞춰 적절히 등록 및 등록 해제를 관리하지 않으면 메모리 누수를 초래할 수 있다. 예를 들어, 액티비티에서 등록한 리시버를 onDestroy 메서드에서 해제하지 않으면, 해당 액티비티가 소멸된 후에도 리시버가 시스템에 남아 불필요한 자원을 소모하게 된다.
또한, 브로드캐스트 리시버의 onReceive 메서드는 메인 스레드에서 실행되며, 10초 이내에 실행을 완료해야 한다. 이 시간을 초과하면 ANR이 발생하여 앱이 강제 종료될 수 있다. 따라서 네트워크 호출이나 데이터베이스 작업과 같은 시간이 오래 걸리는 작업은 서비스를 시작하거나 WorkManager와 같은 백그라운드 작업 스케줄러를 활용하여 처리해야 한다.
